package ve.ucv.patologiaocular.showcase;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ve.ucv.patologiaocular.dao.PacienteDAO;
import ve.ucv.patologiaocular.dao.PacienteDAOImpl;
import ve.ucv.patologiaocular.dao.ProyectoDAO;
import ve.ucv.patologiaocular.dao.ProyectoDAOImpl;
import ve.ucv.patologiaocular.dao.SolicitudDeBiopsiaDAO;
import ve.ucv.patologiaocular.dao.SolicitudDeBiopsiaDAOImpl;
import ve.ucv.patologiaocular.domain.Paciente;
import ve.ucv.patologiaocular.domain.Proyecto;
import ve.ucv.patologiaocular.domain.SolicitudDeBiopsia;
import ve.ucv.patologiaocular.util.ListaSolicitud;

import com.opensymphony.xwork2.ActionSupport;

public class ListarSolicitud extends ActionSupport {

	private static final long serialVersionUID = 1285828914508352193L;
	private static final Log log = LogFactory.getLog(ListarSolicitud.class);
	private SolicitudDeBiopsiaDAO solicitudDeBiopsiaDAO = null;
	private PacienteDAO pacienteDAO = null;
	private ProyectoDAO proyectoDAO = null;
	private List<ListaSolicitud> gridModel;
	private List<ListaSolicitud> solicitudes;
	private List<SolicitudDeBiopsia> solicitudesDeBiopsia;
	private Paciente paciente;
	private Proyecto proyecto;
	private Integer rows = 0;
	private Integer page = 0;
	private Integer total = 0;
	private Integer records = 0;
	private boolean loadonce = false;
	private String fecha;
	private String tipoSolicitud;
	private String codigo;
	private String ano;
	private String nombre;
	private String apellido;
	private String nombreProyecto;
	
	public String execute() {
		log.debug("Page " + getPage()+" Rows " + getRows());
	    this.solicitudDeBiopsiaDAO = new SolicitudDeBiopsiaDAOImpl();
	    
	    if(fecha == null && tipoSolicitud == null && codigo == null && ano == null && nombre == null && apellido == null && nombreProyecto == null){
	    	solicitudesDeBiopsia = solicitudDeBiopsiaDAO.listarSolicitudesDeBiopsia();
	    }
	    else{
	    	solicitudesDeBiopsia = solicitudDeBiopsiaDAO.buscarSolicitud(fecha, tipoSolicitud, codigo, ano, nombre, apellido, nombreProyecto);
	    }
	    
	    if(solicitudesDeBiopsia.size() > 0){
		    this.pacienteDAO = new PacienteDAOImpl();
	    	this.proyectoDAO = new ProyectoDAOImpl();
	    	solicitudes = new ArrayList<ListaSolicitud>();
	    	
	    	for(SolicitudDeBiopsia s : solicitudesDeBiopsia){
	    		if(s.getPacienteId() != null){
	    			paciente = pacienteDAO.buscar(s.getPacienteId().getId());
	    			solicitudes.add(new ListaSolicitud(s.getId(), s.getTipoSolicitud()+"-"+s.getCodigo()+"-"+s.getAno(), 
		    				paciente.getNombre()+" "+paciente.getApellido(), "", s.getFecha()));
	    		}
	    		if(s.getProyectoId() != null){
	    			proyecto = proyectoDAO.buscar(s.getProyectoId().getId());
	    			solicitudes.add(new ListaSolicitud(s.getId(), s.getTipoSolicitud()+"-"+s.getCodigo()+"-"+s.getAno(), "",
	    					proyecto.getNombre(), s.getFecha()));
	    		}
	    		
	    	}
	    }
    	
    	if(solicitudesDeBiopsia.size() == 0){
    		setRecords(0);
    	}
    	else{
    		setRecords(solicitudes.size());
    	}

	    int to = (getRows() * getPage());
	    int from = to - getRows();

	    if (to > getRecords()) to = getRecords();

	    if (loadonce)
	    {
	    	if(solicitudesDeBiopsia.size() == 0){
	    		setGridModel(null);
	    	}
	    	else{
	    		setGridModel(solicitudes);
	    	}
	    }
	    else
	    {
	    	if(solicitudesDeBiopsia.size() == 0){
	    		setGridModel(null);
	    	}
	    	else{
	    		setGridModel(solicitudes.subList(from, to));
	    	}
	    }
	    
	    setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
		    
	    return SUCCESS;
	}
	
	public String getJSON()
	{
	    return execute();
	}

	public SolicitudDeBiopsiaDAO getSolicitudDeBiopsiaDAO() {
		return solicitudDeBiopsiaDAO;
	}

	public void setSolicitudDeBiopsiaDAO(SolicitudDeBiopsiaDAO solicitudDeBiopsiaDAO) {
		this.solicitudDeBiopsiaDAO = solicitudDeBiopsiaDAO;
	}

	public PacienteDAO getPacienteDAO() {
		return pacienteDAO;
	}

	public void setPacienteDAO(PacienteDAO pacienteDAO) {
		this.pacienteDAO = pacienteDAO;
	}

	public ProyectoDAO getProyectoDAO() {
		return proyectoDAO;
	}

	public void setProyectoDAO(ProyectoDAO proyectoDAO) {
		this.proyectoDAO = proyectoDAO;
	}

	public List<ListaSolicitud> getGridModel() {
		return gridModel;
	}

	public void setGridModel(List<ListaSolicitud> gridModel) {
		this.gridModel = gridModel;
	}

	public List<ListaSolicitud> getSolicitudes() {
		return solicitudes;
	}

	public void setSolicitudes(List<ListaSolicitud> solicitudes) {
		this.solicitudes = solicitudes;
	}

	public List<SolicitudDeBiopsia> getSolicitudesDeBiopsia() {
		return solicitudesDeBiopsia;
	}

	public void setSolicitudesDeBiopsia(List<SolicitudDeBiopsia> solicitudesDeBiopsia) {
		this.solicitudesDeBiopsia = solicitudesDeBiopsia;
	}

	public Paciente getPaciente() {
		return paciente;
	}

	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}

	public Integer getRows() {
		return rows;
	}

	public void setRows(Integer rows) {
		this.rows = rows;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getRecords() {
		return records;
	}

	public void setRecords(Integer records) {
		this.records = records;
		
		if (this.records > 0 && this.rows > 0)
	    {
	      this.total = (int) Math.ceil((double) this.records / (double) this.rows);
	    }
	    else
	    {
	      this.total = 0;
	    }
	}

	public boolean isLoadonce() {
		return loadonce;
	}

	public void setLoadonce(boolean loadonce) {
		this.loadonce = loadonce;
	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public String getTipoSolicitud() {
		return tipoSolicitud;
	}

	public void setTipoSolicitud(String tipoSolicitud) {
		this.tipoSolicitud = tipoSolicitud;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) {
		this.ano = ano;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getNombreProyecto() {
		return nombreProyecto;
	}

	public void setNombreProyecto(String nombreProyecto) {
		this.nombreProyecto = nombreProyecto;
	}
}
